package jers.impl;

import java.io.Serializable;

import jers.JERS;
import jers.Job;
import jers.Result;
import jers.util.Utility;


/**
 * Classe que implementa a interface {@link Job}.
 * <p>
 * Esta espera um objeto {@link Runnable} contendo a implementacao 
 * para o metodo {@link #run()} e deve ser implementar a interface
 * {@link Serializable}.
 * </p>
 * 
 * @see {@link SystemFactory}, {@link Job}
 * 
 * @author 
 * 		<a href="mailto:felipe.zappala@gmail.com">
 * 			Luis Felipe Zappala
 * 		</a> [ <a href="http://lncc.br/ist">ISTCC-P</a> / 2009 ]
 */
final class RemoteJob implements Job {

	/** O ID serial da versao */
	private static final long serialVersionUID = 6344299777373022490L;
	
	/** O trabalho real a ser executado. */
	private final Runnable job;
	
	/** Os resultados do trabalho. */
	private final Result results;
	
	/**
	 * O construtor padrao do objeto {@link RemoteJob}.
	 * 
	 * @param 
	 * 		job - A instancia de um objeto {@link Runnable} 
	 * 			  e {@link Serializable}.
	 * 			 
	 */
	public RemoteJob(Runnable job) {
		if (job == null) {
			throw new IllegalArgumentException("The job is null");
		}
		if (!(job instanceof Serializable)) { 
			throw new IllegalArgumentException("The job is not serializable");
		}
		this.job = job;
		if (job instanceof Job) {
			Job realJob = (Job) job;
			this.results = realJob.results();
		} else {
			this.results = JERS.factory.newResult();			
		}
	}
	
	public Result results() {
		return this.results;
	}

	public void run() {
		this.job.run();
	}

	/**
	 * Retorna uma representacao {@link String} do objeto.
	 * <p>
	 * <b>Formato:</b><br>
	 * 		<code>ClassName{attributeA:valueA,...,attributeN:valueN}</code>
	 * </p>
	 * @return 
	 * 		A representacao {@link String} do objeto.
	 */
	@Override
	public String toString() {
		return Utility.toString(this);
    }
	
}
